package movilmax.sia_corp.action;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ActionContext;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import movilmax.sia_corp.model.*;

import apli.conectar.*;
import apli.procesos.Auditar;

import basedatos.BaseDatos;
import basedatos.Resultado;
import basedatos.Fecha;
import utilidades.Cadena;

public class Loguear extends ActionSupport {
      private static final long serialVersionUID = 145454654L;
	
	  private Usuario usuario;
	  private String mensaje;
	  private String val_session;
	  private LinkedList<Usuario> rpt_lista;

	  public String consultar() {
		    rpt_lista = new LinkedList<Usuario>();
		    Map<?, ?> session = ActionContext.getContext().getSession();
		    Usuario USUARIO = (Usuario)session.get("ses_usuario");
		    if (USUARIO!=null){
			    Conectar BASE= new Conectar();
			    if(BASE.getMsg().equals("SI" )  ){
			    String SQL="Select U.usuario,UPPER(U.descripcion) as descripcion,U.ip_desde,S.descripcion as des_suc,D.descripcion as dep,P.descripcion as des_perfil,U.ext,U.ult_aviso_hora From perfiles P,roles R,departamentos D,sucursales S,usuarios U Where U.conectado='1' and U.bloqueado='0' and U.mostrar='1' and U.departamento=D.cod and R.cod=U.rol and S.cod=U.sucursal and U.perfil=P.cod Order By U.perfil ASC,U.descripcion ";
				Resultado RCS=BASE.getBaseDatos().consultar(SQL);
				 if(RCS.RP){
					//int i=1;
					boolean x=false;
				     do{
						  Usuario us= new Usuario();
						  us.setUsuario(RCS.getCadena("usuario"));
						  us.setDescripcion(RCS.getCadena("descripcion"));
						  us.setIp(RCS.getCadena("ip_desde"));
						  us.setExt(RCS.getCadena("ext"));
						  us.setUas(RCS.getCadena("ult_aviso_hora"));
						  Departamento dx=new Departamento();
						  dx.setDescripcion(RCS.getCadena("dep"));
						  Sucursal sx=new Sucursal();
						  sx.setDescripcion(RCS.getCadena("des_suc"));
						  Perfil px=new Perfil();
						  px.setDescripcion(RCS.getCadena("des_perfil"));
						  us.setDepartamento(dx);
						  us.setPerfil(px);
						  us.setSucursal(sx);
						  x=(x ? false: true);
						  us.setI(x);	
						  rpt_lista.add(us);
						//  i++;
				      }while(RCS.sigItem()); 
				   }	
				  BASE.getBaseDatos().cerrarConexion(); 
			    }else{
					this.addActionError("No hay conexion al servidor");	
					return ERROR;
				}
		    }else{
		    	this.addActionError("Su sesion ha caducado");	
		    	 return ERROR;
		    }
		  return SUCCESS;
	  }
	@SuppressWarnings({ "unchecked", "rawtypes" })
	public String iniciar_sesion() throws Exception {
		  if(usuario!=null){
			  String CABECERA,MSG_EM;
			  Fecha 	  F       = new Fecha();
			  String FECHA      = F.getFecha();
			  String HORA       = F.getHoras();
			  Conectar BASE= new Conectar();
			  BASE.getBaseDatos().ejecutar("update usuarios set sesiones=sesiones+1,fallas='0',ult_sesion='"+FECHA+"',ult_aviso_fecha='"+FECHA+"',ult_aviso_hora='"+HORA+"',ip_desde='"+usuario.getIp()+"',conectado='1' where usuario='"+usuario.getUsuario() +"' ");
			  usuario.setId_sesion(BASE.getBaseDatos().generarCodigo("corp_sesiones", "codigo"));
			  BASE.getBaseDatos().ejecutar("INSERT INTO corp_sesiones (codigo,usuario,fecha,hora,f_fin,h_fin,ip,activa) VALUES('"+usuario.getId_sesion() +"','"+usuario.getUsuario() +"','"+FECHA+"','"+HORA+"','"+FECHA+"','"+HORA+"','"+usuario.getIp()+"','1' ) ");
			  Map session = ActionContext.getContext().getSession();
		      session.put("ses_usuario", usuario);
		      setMensaje("Usuario logueado");
		      CABECERA = "[ Sesion iniciada correctamente (SIA-WEB) ] ";
		      MSG_EM = "";
		      MSG_EM = "<br/>Se ha iniciado sesion correctamente [SIA-WEB] <br/>";
		      MSG_EM = MSG_EM + "<br/>Usuario        : " + usuario.getUsuario();
		      MSG_EM = MSG_EM + "<br/>Ip             : " + usuario.getIp();
			  MSG_EM = MSG_EM + "<br/>Fecha          : " + new Fecha().getFecha() +" "+new Fecha().getHoras();
		      String SQL="INSERT INTO apli_emails (de,para,cabecera,mensaje) VALUES('sia@movilmax.com','" + usuario.getEmail() + "','" + CABECERA + "','" + MSG_EM + "' ) ";
		      BASE.getBaseDatos().ejecutar(SQL);
		      Auditar AUD = new Auditar(BASE.getBaseDatos());
		      AUD.abrirSesion(usuario.getUsuario(),usuario.getIp());
			  AUD.GuardaHistorial(AUD.getId(),"INICIO_SESION",SQL );
			  session.put("ses_auditoria", AUD.getId());
		      BASE.getBaseDatos().cerrarConexion(); 
			  return SUCCESS;
		 }else{
			  return NONE;
		 }
	  }
	  
	 public void validate(){	
		 if(usuario!=null){  
			usuario.setUsuario(new Cadena().valSQLI(usuario.getUsuario()));	
			if ( usuario.getUsuario().length() == 0 ){	
				this.addActionError("Debe ingresar el nombre de usuario" );
				setMensaje("Debe ingresar el nombre de usuario");
				return;
			}
			if ( usuario.getClave().length() == 0 ){	
				this.addActionError( "Debe ingresar la clave" );
				setMensaje("Debe ingresar la clave");
				return;
			}
			Conectar BASE= new Conectar();
			if(!BASE.getMsg().equals("SI")){
				this.addActionError( "No hay conexion al servidor" );
				setMensaje("No hay conexion al servidor");
				return;
			}
			Cadena C = new Cadena();
			usuario.setUsuario(usuario.getUsuario().toLowerCase());
            //Resultado RCS = BASE.getBaseDatos().consultar("Select U.usuario,U.clave2 as clave,U.sesiones,U.bloqueado,U.email,U.descripcion,U.cargo,U.celular,U.telefono,U.ext,U.rol,U.perfil,U.departamento,U.sucursal,P.descripcion as des_perfil,D.descripcion as des_departamento,R.descripcion as des_rol,S.descripcion as des_sucursal from usuarios U,departamentos D,Roles R,perfiles P,sucursales S where U.usuario='"+ usuario.getUsuario() +"' and U.rol=R.cod and U.departamento=D.cod and U.sucursal=S.cod and U.perfil=P.cod  ");
			Resultado RCS = BASE.getBaseDatos().consultar("Select U.fallas,U.usuario,U.clave2 as clave,U.sesiones,U.bloqueado,U.email,U.descripcion,U.cargo,U.celular,U.telefono,U.ext,U.rol,U.perfil,U.departamento,U.sucursal,P.descripcion as des_perfil,D.descripcion as des_departamento,R.descripcion as des_rol,S.descripcion as des_sucursal, E.jerarquia,U.cod_empleado as empleado,DATEDIFF( day,GETDATE(),cla_expira) as cvence from usuarios U,departamentos D,Roles R,perfiles P,sucursales S,empleados E where U.usuario='"+ usuario.getUsuario() +"' and U.rol=R.cod and U.departamento=D.cod and U.sucursal=S.cod and U.perfil=P.cod and U.cod_empleado=E.codigo");
            if(RCS.hayRegistros() ){
            	if ( RCS.getCadena("bloqueado").equals("1")){	
            		this.addActionError("Usuario bloqueado");
            		setMensaje("Usuario bloqueado");
            		BASE.getBaseDatos().cerrarConexion(); 
					return;
				}
            	if ( RCS.getInt("fallas")>= 5){	
            		this.addActionError("La cuenta esta bloqueada por exceder el limite de intentos fallidos.");
            		setMensaje("La cuenta esta bloqueada por exceder el limite de intentos fallidos.");
            		BASE.getBaseDatos().cerrarConexion(); 
					return;
				}
            	/*if ( RCS.getLong("cvence")<0){	
            		this.addActionError("Debe cambiar su clave actual para poder iniciar sesion.");
            		setMensaje("Debe cambiar su clave actual para poder iniciar sesion.");
            		BASE.getBaseDatos().cerrarConexion(); 
					return;
				}*/
				if (!C.encriptarVj(usuario.getClave()).equals( RCS.getCadena("clave") ) ){	
					String CABECERA,MSG_EM;
					int contar_intentos=RCS.getInt("fallas")+1;
					this.addActionError( "Clave invalida");
					setMensaje("Clave invalida");
					if((5 - contar_intentos)>0){
						setVal_session("Restan " + (5 - contar_intentos) + " intentos antes de bloquear su cuenta");////
						CABECERA= "[ Error inicio de sesion [SIA-WEB] - clave invalida ] "; 
						MSG_EM = "";
						MSG_EM = "<br/>Se ha registrado un intento de inicio de sesion [SIA-WEB] con clave errada <br/>";
						MSG_EM = MSG_EM + "<br/>Usuario        : " + usuario.getUsuario();
						MSG_EM = MSG_EM + "<br/>Ip             : " + usuario.getIp();
						MSG_EM = MSG_EM + "<br/>Fecha          : " + new Fecha().getFecha() +" "+new Fecha().getHoras();
					}else{
						setVal_session("La cuenta ha sido bloqueada");
						CABECERA= "[ Cuenta bloqueada [SIA-WEB] ] ";
						MSG_EM = "";
						MSG_EM = "<br/>Su cuenta ha sido bloqueada por execeder el limite de intentos errados <br/>";
						MSG_EM = MSG_EM + "<br/>Usuario        : " + usuario.getUsuario();
						MSG_EM = MSG_EM + "<br/>Ip             : " + usuario.getIp();
						MSG_EM = MSG_EM + "<br/>Fecha          : " + new Fecha().getFecha() +" "+new Fecha().getHoras() ;
					}
					BASE.getBaseDatos().ejecutar("UPDATE usuarios set fallas="+contar_intentos+" WHERE usuario='"+ usuario.getUsuario() +"'");
					BASE.getBaseDatos().ejecutar("INSERT INTO apli_emails (de,para,cabecera,mensaje) VALUES('sia@movilmax.com','" + RCS.getCadena("email") + "','" + CABECERA + "','" + MSG_EM + "' )");
					BASE.getBaseDatos().ejecutar("INSERT INTO apli_emails (de,para,cabecera,mensaje) VALUES('sia@movilmax.com','jhonny.cuevas@movilmax.com','" + CABECERA + "','" + MSG_EM + "' )");
					//System.out.println("*******************************  INSERT INTO apli_emails (de,para,cabecera,mensaje) VALUES('sia@movilmax.com','" + RCS.getCadena("email") + "','" + CABECERA + "','" + MSG_EM + "' )");
					//System.out.println("-------------------------------  INSERT INTO apli_emails (de,para,cabecera,mensaje) VALUES('sia@movilmax.com','sistemas@movilmax.com','" + CABECERA + "','" + MSG_EM + "' )");
					BASE.getBaseDatos().cerrarConexion(); 
					return;
				}
				usuario.setClave(RCS.getCadena("clave"));
				usuario.setSesiones( new Cadena().convertirStr(RCS.getInt("sesiones")+1 ) );
				usuario.setEmail(RCS.getCadena("email"));
				usuario.setDiasc(RCS.getLong("cvence") );
				usuario.setMsg_c("SI");
				usuario.setCelular(RCS.getCadena("celular"));
				usuario.setExt(RCS.getCadena("ext"));
				usuario.setTelefono(RCS.getCadena("telefono"));
				usuario.setDescripcion(RCS.getCadena("descripcion"));
				usuario.setCargo(RCS.getCadena("cargo"));
				usuario.setCodEmpleado(RCS.getInt("empleado"));
				usuario.setJerarquia(RCS.getCadena("jerarquia"));
				Rol rx=new Rol();
				rx.setCod(RCS.getCadena("rol"));
				rx.setDescripcion(RCS.getCadena("des_rol"));
				usuario.setRol(rx);
				Perfil px=new Perfil();
				px.setCod(RCS.getCadena("perfil"));
				px.setDescripcion(RCS.getCadena("des_perfil"));
				usuario.setPerfil(px);
				Sucursal sx=new Sucursal();
				sx.setCod(RCS.getCadena("sucursal"));
				sx.setDescripcion(RCS.getCadena("des_sucursal"));
				usuario.setSucursal(sx);
				Departamento dx=new Departamento();
				dx.setCod(RCS.getCadena("departamento"));
				dx.setDescripcion(RCS.getCadena("des_departamento"));
				usuario.setDepartamento(dx);
				usuario.setJerarquia(RCS.getCadena("jerarquia"));
				//empleado.setJerarquia(RCS.getCadena("jerarquia"));
				//empleado.setJerarquia(RCS.getCadena("jerarquia"));
				//usuario.setEmpleado(empleado);
				RCS = BASE.getBaseDatos().consultar("Select V.cod,V.supervisor,V.tipo,U.email from usuarios U,vendedores V where V.usuario='"+ usuario.getUsuario() +"' and V.supervisor=U.usuario ");
	            if(RCS.RP){
	            	usuario.setCod_vendedor(RCS.getCadena("cod"));
	            	usuario.setSupervisor(RCS.getCadena("supervisor"));
	            	usuario.setEmail_sup(RCS.getCadena("email"));
	            }else{
	            	usuario.setCod_vendedor("0");
	            	usuario.setSupervisor("sistema");
	            	usuario.setEmail_sup("sistemas@movilmax.com");
	            }
            }else{
        	   setMensaje("Usuario="+usuario.getUsuario()+" no existe!");
        	   setVal_session("");
        	   this.addActionError("Usuario="+usuario.getUsuario()+" no existe!" );	 
            }
           BASE.getBaseDatos().cerrarConexion(); 
		 }
	 }  
	 
	@SuppressWarnings("rawtypes")
	public String cerrar_sesion() throws Exception {
		    Map session = ActionContext.getContext().getSession();
		    Usuario USUARIO = (Usuario)session.get("ses_usuario");
		    if (USUARIO!=null){
			    session.remove("ses_usuario");
			    Conectar BASE= new Conectar();
			    if(BASE.getMsg().equals("SI" ) ){
			    	Fecha 	  F       = new Fecha();
					String FECHA      = F.getFecha();
					String HORA       = F.getHoras();
					BASE.getBaseDatos().ejecutar("UPDATE usuarios set conectado='0' where usuario='"+USUARIO.getUsuario() +"' ");
					BASE.getBaseDatos().ejecutar("UPDATE corp_sesiones SET f_fin='"+FECHA+"',h_fin='"+HORA+"',activa='0' Where codigo='"+USUARIO.getId_sesion() +"' ");
					String ID_AUD = (String)session.get("ses_auditoria");
					Auditar AUD = new Auditar(BASE.getBaseDatos());
					AUD.CerrarSesion(ID_AUD);
					BASE.getBaseDatos().cerrarConexion(); 
				}
		    } 
		return SUCCESS;
    } 
	  
    @SuppressWarnings("rawtypes")
	public Nodo getNodosArbol() { 
    	Nodo MenuArbol_ = new Nodo();
    	Map session = ActionContext.getContext().getSession();
	    Usuario USUARIO = (Usuario)session.get("ses_usuario");
	    if (USUARIO!=null){
		    Conectar BASE= new Conectar();
		    if(BASE.getMsg().equals("SI" ) ){
		    	MenuArbol_=listarNodos(BASE.getBaseDatos(),USUARIO.getUsuario(),"-1","Sia-Movilmax","","-1","root");
		    	BASE.getBaseDatos().cerrarConexion(); 
			}else{
				MenuArbol_.setCod("-1");
				MenuArbol_.setTexto("SIN CONEXION"); 
			}
	    }else{
	    	MenuArbol_.setCod("-1");
	    	MenuArbol_.setTexto("DEBES INICIAR SESION");  
	    }
	    
        return MenuArbol_;
   }  
    
   @SuppressWarnings({ "rawtypes", "unchecked" })
private Nodo listarNodos(BaseDatos BASE,String usu,String id,String txt,String url,String par,String tipo){
	      Nodo raiz = new Nodo();
	      raiz.setCod(id);
	      raiz.setTexto(txt);
	      raiz.setUrl(url);
	      raiz.setParametro(par);
	      raiz.setTipo(tipo);
	      raiz.setState("abierto");
		  String SQL="SELECT M.cod,M.titulo,M.descripcion,M.urlx,M.padre,M.tipo FROM menus M,permisos_rol P,usuarios U WHERE U.usuario='"+ usu +"' and U.rol=P.rol and P.permitido='1' and P.menu=M.cod and M.padre='"+id+"' and M.activo='1' and not M.padre='0' and not M.cod='-1' and M.web='1' Order By M.orden";
		  Resultado rcs=BASE.consultar(SQL);
		  String tpx="";
	   	  if(rcs.RP==true){
	   		  List lista = new ArrayList();
				do{
			    	  Nodo nd = new Nodo();
			    	  if (rcs.getCadena("tipo").equals("0"))
			    		 tpx="root";
			    	  else if (rcs.getCadena("tipo").equals("2"))
			    		 tpx="folder";  
			    	  else
			    		 tpx="file";  
				      //nd=listarNodos(usu,rcs.getCadena("cod"),rcs.getCadena("descripcion"),rcs.getCadena("urlx"),rcs.getCadena("cod"),tpx);
				      nd=listarNodos(BASE,usu,rcs.getCadena("cod"),rcs.getCadena("descripcion"),rcs.getCadena("urlx"),rcs.getCadena("cod"),tpx);
				      lista.add(nd);
		          }while(rcs.sigItem());
			 raiz.setHijos(lista);	
		  }
	   return raiz;  
   }

	public Usuario getUsuario() {
		return usuario;	
	}
    public void setUsuario(Usuario x) {
		this.usuario = x;
	}

	public String getMensaje() {
		return mensaje;
	}
	public void setMensaje(String mensaje) {
		this.mensaje = mensaje;
	}
	public LinkedList<Usuario> getRpt_lista() {
		return rpt_lista;
	}
	public void setRpt_lista(LinkedList<Usuario> rpt_lista) {
		this.rpt_lista = rpt_lista;
	}
	public String getVal_session() {
		return val_session;
	}
	public void setVal_session(String val_session) {
		this.val_session = val_session;
	}
    
    
}
